--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
tests/backend/test_web_audio_bridge.py 33db12b971deeddf7b63d3e96fb5123a355b7986 (33db12b9) Text, 3.27 KB
Tff7b72import T7ee787asyncio
Tff7b72from T7ee787unittestT7ee787.T7ee787mock Tff7b72import Te6edf3MagicMockTb4b4b4, Te6edf3patch
Tff7b72import T7ee787numpy Tff7b72as T7ee787np
Tff7b72import T7ee787pytest
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787web_audio_bridge Tff7b72import Tb4b4b4(
Te6edf3WebAudioBridgeTb4b4b4,
Te6edf3WebAudioSinkTb4b4b4,
Te6edf3WebAudioSourceTb4b4b4,
Tb4b4b4)
Tff7b72class T56d364_DummySinkTb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffframes Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72def Td2a8ffcan_receiveTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3from_sourceTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72True
Tff7b72def Td2a8ffhandle_frameTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3frameTb4b4b4, Te6edf3sourceTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffframesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3frameTb4b4b4)
Tff7b72def Td2a8fftest_web_audio_source_pushes_framesTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3sink Tff7b72= Te6edf3_DummySinkTb4b4b4(Tb4b4b4)
Te6edf3src Tff7b72= Te6edf3WebAudioSourceTb4b4b4(Te6edf3target_frame_msTff7b72=T79c0ff60Tb4b4b4, Te6edf3sinkTff7b72=Te6edf3sinkTb4b4b4)
Te6edf3zeros Tff7b72= Te6edf3npTff7b72.Td2a8ffzerosTb4b4b4(T79c0ff160Tb4b4b4, Te6edf3dtypeTff7b72=Te6edf3npTff7b72.Td2a8ffint16Tb4b4b4)
Te6edf3srcTff7b72.Td2a8ffpush_pcmTb4b4b4(Te6edf3zerosTff7b72.Td2a8fftobytesTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3sinkTff7b72.Td2a8ffframesTb4b4b4) Tff7b72== T79c0ff1
Tff7b72def Td2a8fftest_web_audio_sink_encodes_and_sends_bytesTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3loop Tff7b72= Te6edf3asyncioTff7b72.Td2a8ffnew_event_loopTb4b4b4(Tb4b4b4)
Te6edf3asyncioTff7b72.Td2a8ffset_event_loopTb4b4b4(Te6edf3loopTb4b4b4)
Te6edf3sent Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72async Tff7b72def Td2a8ff_send_bytesTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4:
Te6edf3sentTff7b72.Td2a8ffappendTb4b4b4(Te6edf3dataTb4b4b4)
Te6edf3sink Tff7b72= Te6edf3WebAudioSinkTb4b4b4(Te6edf3loopTb4b4b4, Te6edf3_send_bytesTb4b4b4)
Te6edf3sinkTff7b72.Td2a8ffhandle_frameTb4b4b4(Te6edf3npTff7b72.Td2a8ffzerosTb4b4b4(Tb4b4b4(T79c0ff160Tb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4, Te6edf3dtypeTff7b72=Te6edf3npTff7b72.Td2a8fffloat32Tb4b4b4)Tb4b4b4, Tff7b72NoneTb4b4b4)
Te6edf3loopTff7b72.Td2a8ffrun_until_completeTb4b4b4(Te6edf3asyncioTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.01Tb4b4b4)Tb4b4b4)
Te6edf3loopTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3sentTb4b4b4, Ta5d6ff"Ta5d6ffexpected audio bytes to be queued for sendingTa5d6ff"
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_web_audio_bridge_lazy_loopTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""Test that WebAudioBridge retrieves the loop lazily to avoid startup crashes."""
Te6edf3mock_tele_mgr Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_config_mgr Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
T8b949e# Mock get_event_loop to simulate it not being available during init
Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffasyncio.get_event_loopTa5d6ff"Tb4b4b4, Te6edf3side_effectTff7b72=Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffNo running loopTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3bridge Tff7b72= Te6edf3WebAudioBridgeTb4b4b4(Te6edf3mock_tele_mgrTb4b4b4, Te6edf3mock_config_mgrTb4b4b4)
Tff7b72assert Te6edf3bridgeTff7b72.Td2a8ff_loop Tff7b72is Tff7b72None
T8b949e# Simulate a running loop
Te6edf3current_loop Tff7b72= Te6edf3asyncioTff7b72.Td2a8ffget_running_loopTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3bridgeTff7b72.Td2a8ffloop Tff7b72== Te6edf3current_loop
Tff7b72assert Te6edf3bridgeTff7b72.Td2a8ff_loop Tff7b72== Te6edf3current_loop
Tff7b72def Td2a8fftest_web_audio_config_enabled_follows_telephone_web_audio_flagTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3cfg Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3cfgTff7b72.Td2a8fftelephone_web_audio_enabledTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72True
Te6edf3bridge Tff7b72= Te6edf3WebAudioBridgeTb4b4b4(Tff7b72NoneTb4b4b4, Te6edf3cfgTb4b4b4)
Tff7b72assert Te6edf3bridgeTff7b72.Td2a8ffconfig_enabledTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72True
Te6edf3cfgTff7b72.Td2a8fftelephone_web_audio_enabledTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72False
Tff7b72assert Te6edf3bridgeTff7b72.Td2a8ffconfig_enabledTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72False
Tff7b72def Td2a8fftest_web_audio_config_disabled_without_config_managerTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3bridge Tff7b72= Te6edf3WebAudioBridgeTb4b4b4(Tff7b72NoneTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72assert Tff7b72not Te6edf3bridgeTff7b72.Td2a8ffconfig_enabledTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fftest_web_audio_allow_fallback_follows_configTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3cfg Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3cfgTff7b72.Td2a8fftelephone_web_audio_allow_fallbackTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72True
Te6edf3bridge Tff7b72= Te6edf3WebAudioBridgeTb4b4b4(Tff7b72NoneTb4b4b4, Te6edf3cfgTb4b4b4)
Tff7b72assert Te6edf3bridgeTff7b72.Td2a8ffallow_fallbackTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72True
Te6edf3cfgTff7b72.Td2a8fftelephone_web_audio_allow_fallbackTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72False
Tff7b72assert Te6edf3bridgeTff7b72.Td2a8ffallow_fallbackTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72False
Tff7b72def Td2a8fftest_web_audio_bridge_asyncutils_fallbackTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""Test that WebAudioBridge falls back to AsyncUtils.main_loop if no loop is running."""
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787async_utils Tff7b72import Te6edf3AsyncUtils
Te6edf3AsyncUtilsTff7b72.Td2a8ffmain_loop Tff7b72= Tff7b72None
Te6edf3AsyncUtilsTff7b72.Td2a8ff_pending_coroutinesTff7b72.Td2a8ffclearTb4b4b4(Tb4b4b4)
Te6edf3mock_loop Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3specTff7b72=Te6edf3asyncioTff7b72.Td2a8ffAbstractEventLoopTb4b4b4)
Te6edf3mock_loopTff7b72.Td2a8ffis_runningTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72False
Te6edf3AsyncUtilsTff7b72.Td2a8ffset_main_loopTb4b4b4(Te6edf3mock_loopTb4b4b4)
Te6edf3mock_tele_mgr Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_config_mgr Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffasyncio.get_running_loopTa5d6ff"Tb4b4b4, Te6edf3side_effectTff7b72=Tf85149RuntimeErrorTb4b4b4)Tb4b4b4:
Te6edf3bridge Tff7b72= Te6edf3WebAudioBridgeTb4b4b4(Te6edf3mock_tele_mgrTb4b4b4, Te6edf3mock_config_mgrTb4b4b4)
Tff7b72assert Te6edf3bridgeTff7b72.Td2a8ffloop Tff7b72== Te6edf3mock_loop
Tff7b72assert Te6edf3bridgeTff7b72.Td2a8ff_loop Tff7b72== Te6edf3mock_loop
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────